#include<iostream>
#include<signal.h>
#include<unistd.h>
#include<vector>


//#define BLOCK_SIGNAL 2
#define MAX_SIGNUM 31


//static std::vector<int> sigarr = {2,3};
static std::vector<int> sigarr = {2};


static void show_pending(const sigset_t& pending)
{
    for(int signo = MAX_SIGNUM;signo >= 1;signo--)
    {
        if(sigismember(&pending,signo)) std::cout<<"1";
        else std::cout<<"0";
    }
    std::cout<<"\n";
}

static void myhandler(int signo)
{
    std::cout<<signo<<" 号信号已经被递达!!"<<std::endl;
}

void test()
{
    for(const auto& sig : sigarr) signal(sig,myhandler);
    
    //默认情况, 我们的所有信号都是不被阻塞的
    //默认情况, 如果一个信号被屏蔽了, 该信号不会被递达
    //1. 先尝试屏蔽指定的信号
    sigset_t block,oblock,pending;
    //1.1 初始化
    sigemptyset(&block);
    sigemptyset(&oblock);
    sigemptyset(&pending);
    //1.2 添加要屏蔽的信号
    for(const auto& sig : sigarr) sigaddset(&block,sig);
    //1.3 开始屏蔽  设置进内核(进程)
    sigprocmask(SIG_SETMASK,&block,&oblock);

    //2. 遍历打印pending信号集
    int cnt = 10;
    while(true)
    {
        //2.1 初始化
        sigemptyset(&pending);
        //2.2 获取它
        sigpending(&pending);
        //2.3 打印它
        show_pending(pending);
        sleep(1);
        if(cnt-- == 0)
        {
            std::cout<<"恢复对信号的屏蔽, 不屏蔽任何信号"<<std::endl;
            sigprocmask(SIG_SETMASK,&oblock,&block);//一旦对特定信号解除屏蔽, 一般OS要至少立马递达一个信号
        }
    }
}
int main()
{
    test();
    return 0;
}